#ifndef SELF_H
# define SELF_H

#include "linuxos.h"

#include "process.h"

#define C_MAX 255

// ┌────────────────────────────────────────────────────────────────────────────────────────────┐
// │ VmPeak: 该进程峰值虚拟内存；                                                                   │
// │ VmSize：整个进程的虚拟内存大小，是VMLib、VmExe、VMData和VmStk的总和；                              │
// │ VmLck：虚拟内存锁。进程当前使用的并且加锁的虚拟内存总数，锁住的内存不能交换到硬盘；                      │
// │ VmHWM：进程所占用物理内存的峰值；                                                                │
// │ VmRSS：进程现在使用的物理内存大小。                                                              │
// │     虚拟内存驻留集合大小，这是驻留在物理内存的一部分，他没有交换到硬盘，包含代码、数据和栈；               │
// │ VmData：虚拟内存数据，堆使用的虚拟内存；                                                          │
// │ VmStk：虚拟内存栈，栈使用的虚拟内存；                                                            │
// │ VmExe：可执行的虚拟内存，可执行的静态链接库所使用的虚拟内存；                                        │
// │ VmLib：虚拟内存库动态链接库所使用的虚拟内存。                                                     │
// │                                                                                            │
// └────────────────────────────────────────────────────────────────────────────────────────────┘
typedef struct _StatusInfo {
    char Name[C_MAX];
    char Umask[C_MAX];
    char State[C_MAX];
    char Tgid[C_MAX];
    char Ngid[C_MAX];
    char Pid[C_MAX];
    char PPid[C_MAX];

    long VmPeak;
    long VmSize;
    long VmLck;
    long VmPin;
    long VmHWM;
    long VmRSS;
} SelfStatusInfo;

static const char proc_self_status_properties[][20] = {
                                            "Name",   // 0
                                            "Umask",  // 1
                                            "State",  // 2
                                            "Tgid",   // 3
                                            "Ngid",   // 4
                                            "Pid",    // 5
                                            "PPid",   // 6

                                            "VmPeak", // 7
                                            "VmSize", // 8
                                            "VmLck",  // 9
                                            "VmPin",  // 10
                                            "VmHWM",  // 11
                                            "VmRSS",  // 12
                                            };


bool self_status_of_buffer(char *buf, SelfStatusInfo *info);
bool proc_self_status_of_buffer(char *buf, SelfStatusInfo *info);

bool initSelfStatusInfo(SelfStatusInfo *info);

#endif